import sys
from bisect import bisect_right, bisect_left
import os
import sys
from io import BytesIO, IOBase
from math import factorial, floor, sqrt, inf, ceil, gcd
from collections import defaultdict, deque, Counter
from functools import cmp_to_key
from heapq import heappop, heappush, heapify
BUFSIZE = 8192
class FastIO(IOBase):
newlines = 0
def __init__(self, file):
self._fd = file.fileno()
self.buffer = BytesIO()
self.writable = "x" in file.mode or "r" not in file.mode
self.write = self.buffer.write if self.writable else None
def read(self):
while True:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
if not b:
break
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines = 0
return self.buffer.read()
def readline(self):
while self.newlines == 0:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
self.newlines = b.count(b"\n") + (not b)
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines -= 1
return self.buffer.readline()
def flush(self):
if self.writable:
os.write(self._fd, self.buffer.getvalue())
self.buffer.truncate(0), self.buffer.seek(0)
class IOWrapper(IOBase):
def __init__(self, file):
self.buffer = FastIO(file)
self.flush = self.buffer.flush
self.writable = self.buffer.writable
self.write = lambda s: self.buffer.write(s.encode("ascii"))
self.read = lambda: self.buffer.read().decode("ascii")
self.readline = lambda: self.buffer.readline().decode("ascii")
sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip("\r\n")
def inp():
return(int(input()))
def inlt():
return(list(map(int,input().split())))
def insr():
s = input().strip()
return(s)
def invr():
return(map(int,input().split()))
def insr2():
s = input()
return(s.split(" "))
def build_mod_inverses(n, r, p):
fact = [1] * (n + 1)
for i in range(1, n + 1):
fact[i] = i * fact[i - 1] % p
inv = [1] * (n + 1)
inv[n] = pow(fact[n], p - 2, p)
for i in range(n - 1, -1, -1):
inv[i] = (i + 1) * inv[i + 1] % p
return fact, inv
def comb(n, r, p, fact, inv):
return fact[n] * inv[r] % p * inv[n - r] % p if n >= r >= 0 else 0
def make_divisors(n):
divisors = []
for i in range(1, int(n**0.5)+1):
if n % i == 0:
divisors.append(i)
if i != n // i and i != 1:
divisors.append(n // i)
return divisors
def dfs(graph, vertex):
visited = set()
tree = []
deq = deque([vertex])
while deq:
vertex = deq.pop()
if vertex not in visited:
visited.add(vertex)
deq.extend(graph[vertex])
tree.append(vertex)
return tree
def find_in_sorted_list(elem, sorted_list):
'Locate the leftmost value exactly equal to x'
i = bisect_left(sorted_list, elem)
if i != len(sorted_list) and sorted_list[i] == elem:
return i
return -1
class SegmentTree:
def __init__(self, data, default=0, func=lambda a, b: a+b):
self._default = default
self._func = func
self._len = len(data)
self._size = _size = 1 << (self._len - 1).bit_length()
self.data = [default] * (2 * _size)
self.data[_size:_size + self._len] = data
for i in reversed(range(_size)):
self.data[i] = func(self.data[i + i], self.data[i + i + 1])
def __delitem__(self, idx):
self[idx] = self._default
def __getitem__(self, idx):
return self.data[idx + self._size]
def __setitem__(self, idx, value):
idx += self._size
self.data[idx] = value
idx >>= 1
while idx:
self.data[idx] = self._func(self.data[2 * idx], self.data[2 * idx + 1])
idx >>= 1
def __len__(self):
return self._len
def query(self, start, stop):
if start == stop:
return self.__getitem__(start)
start += self._size
stop += self._size
res = self._default
while start < stop:
if start & 1:
res = self._func(res, self.data[start])
start += 1
if stop & 1:
stop -= 1
res = self._func(res, self.data[stop])
start >>= 1
stop >>= 1
return res
def __repr__(self):
return "SegmentTree({0})".format(self.data)
class DisjointSetUnion():
def __init__(self, n):
self.n = n
self.parents = [-1] * n
self.group = n
def find(self, x):
if self.parents[x] < 0:
return x
else:
self.parents[x] = self.find(self.parents[x])
return self.parents[x]
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if x == y:
return
self.group -= 1
if self.parents[x] > self.parents[y]:
x, y = y, x
self.parents[x] += self.parents[y]
self.parents[y] = x
def size(self, x):
return -self.parents[self.find(x)]
def same(self, x, y):
return self.find(x) == self.find(y)
def members(self, x):
root = self.find(x)
return [i for i in range(self.n) if self.find(i) == root]
def roots(self):
return [i for i, x in enumerate(self.parents) if x < 0]
def group_count(self):
return self.group
def all_group_members(self):
dic = {r:[] for r in self.roots()}
for i in range(self.n):
dic[self.find(i)].append(i)
return dic
def __str__(self):
return '\n'.join('{}: {}'.format(r, self.members(r)) for r in self.roots())
n, q = inlt()
arr = inlt()
pref = [0 for i in range(n)]
for i in range(q):
l, r = inlt()
pref[l-1] += 1
if r <= n-1:
pref[r] -= 1
s = [0]
for i in range(len(pref)):
s.append(s[-1]+pref[i])
s.sort(reverse=True)
arr.sort(reverse=True)
ans = 0
for i in range(n):
ans += arr[i]*s[i]
print(ans)
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#pragma GCC target("popcnt")
using namespace std;
#define int long long
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define for0(i, n) for (int i = 0; i < n; i++)
#define for1(i, n) for (int i = 1; i <= n; i++)
#define cn cout << "NO"
#define cy cout << "YES"
#define rt0 return 0
#define ce cout << "\n"
#define b second
#define a first
#define double long double
#define si(s) stoi(s)
#define is(n) to_string(n)
#define lla(v) v.rbegin(), v.rend()
#define inf 1e18
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<int> dis(1e10, 1e14);
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
struct cord{
int x1,x2,y1,y2;
};
void solve() {
// ifstream cin("data.in");
// ofstream cout("data.out");
cout << fixed << setprecision (10);
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,q;
cin>>n>>q;
vector<int>v(n);
for(int i=0;i<n;i++){
cin>>v[i];
}
vector<int>u(n+1,0);
for(int i=0;i<q;i++){
int l,r;
cin>>l>>r;
l--;
u[l]++;
u[r]--;
}
for(int i=1;i<=n;i++){
u[i]+=u[i-1];
}
sort(all(v));sort(all(u));
reverse(all(v));reverse(all(u));
int ans=0;
for(int i=0;i<n;i++){
ans+=v[i]*u[i];
}
cout<<ans;
}
signed main() {
// ifstream cin("data.in");
// ofstream cout("data.out");
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
if(0){
int q;
cin>>q;
while(q--){
solve();
}
}
else{
solve();
}
}
// cout << fixed << setprecision (10)
/*
4 1
3 4 1 2
2 3 4 5
1
4 16
3 4 1 2
2 3 4 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//*/
445. Add Two Numbers II | 442. Find All Duplicates in an Array |
437. Path Sum III | 436. Find Right Interval |
435. Non-overlapping Intervals | 406. Queue Reconstruction by Height |
380. Insert Delete GetRandom O(1) | 332. Reconstruct Itinerary |
368. Largest Divisible Subset | 377. Combination Sum IV |
322. Coin Change | 307. Range Sum Query - Mutable |
287. Find the Duplicate Number | 279. Perfect Squares |
275. H-Index II | 274. H-Index |
260. Single Number III | 240. Search a 2D Matrix II |
238. Product of Array Except Self | 229. Majority Element II |
222. Count Complete Tree Nodes | 215. Kth Largest Element in an Array |
198. House Robber | 153. Find Minimum in Rotated Sorted Array |
150. Evaluate Reverse Polish Notation | 144. Binary Tree Preorder Traversal |
137. Single Number II | 130. Surrounded Regions |
129. Sum Root to Leaf Numbers | 120. Triangle |